package com.simple.create.singleton.sample1;


import com.simple.LogUtil;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 单例模式1
 * 弊端: com.simple.create.singleton.sample1.Singleton#getInstance() 在多线程的情况下会返回多个实例
 *
 * @author simple
 * @version 1.0
 * @date 2018/12/6 14:39
 * @since 1.0
 */
public class Singleton {
    private static AtomicInteger count = new AtomicInteger(0);
    /**
     * 持有私有的静态实例, 防止被引用, 赋值为null, 实现延迟加载
     */
    private static Singleton instance = null;

    /**
     * 私有的构造方法, 防止被外部实例化(反射?)
     */
    private Singleton() {
    }

    public static int getInstanceCount() {
        return count.get();
    }

    /**
     * 提供静态方法, 用于创建实例
     *
     * @return 实例
     */
    public static Singleton getInstance() {
        if (null == instance) {
            // 多线程的情况下, 许多线程都会进来, 造成实例不唯一
            LogUtil.info("第" + count.incrementAndGet() + "个实例开始创建...");
            instance = new Singleton();
        }
        return instance;
    }

    /**
     * 如果该对象被序列化, 可以保证对象在序列化前后保持一致
     *
     * @return 实例
     */
    public Object readResolve() {
        return instance;
    }
}
